package Test;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 沈明月
 * Date: 2023-06-29
 * Time: 16:25
 */

//方法里面定义的是局部内部类
//静态内部类：被static修饰
//实例内部类：未被static修饰
class OuterClass1{
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

    /**
     * 如何获取内部类实例化对象？
     *
     * 在实例内部类中是否可以定义静态的成员变量？
     * public static  final int data6 = 6;这种写法可以
     * 类加载的时候不会加载普通的成员变量，实例内部类中存在static，而static实在类加载的时候创建的
     * static是最先执行的，但是实例内部类的实现必须要借助于外部类，也就是说，外部类一定要比内部类先实例化，而static违背了这一规则
     * 而final修饰的是常量，不需要类加载，在编译时就知道值已经是6
     */
    class InnerClass{
        //实例内部类
        public int data4 = 4;
        public  int data5 = 5;
        //public static  int data6 = 6;//报错

        public void test(){
            System.out.println(data4);
            System.out.println(data5);
            System.out.println("内部类的test方法");
        }
    }

    public void test(){
        System.out.println("外部类 的test方法");
    }
}
public class Test2 {
    public static void main(String[] args) {
        //实例化拿到实例内部类
//        OuterClass1 outerClass1 = new OuterClass1();
//        OuterClass1.InnerClass innerClass = outerClass1.new InnerClass();

        //或：
        OuterClass1.InnerClass innerClass = new OuterClass1().new InnerClass();

        //获取实力内部类对象的时候依赖于外部内部类对象

        innerClass.test();//调用的都是内部类的对象
    }
}


/**
 *当外部类中的内部成员和内部类的中的数据成员一样的时候，可以通过外部类名.this.数据成员名来访问外部类的那个数据成员
 *
 */
//class OuterClass2{
//    public int data1 = 1;
//    private int data2 = 2;
//    public static int data3 = 3;
//
//class InnerClass{
//    //实例内部类
//    public int data1 = 1111;
//    public int data4 = 4;
//    public  int data5 = 5;
//
//    public void test(){
//        System.out.println(data1);
//        System.out.println(this.data1);//以上两个调用的均为内部类的data1
//        System.out.println(OuterClass2.this.data1);//调用的是外部类的data1
//        System.out.println(data4);
//        System.out.println(data5);
//        System.out.println("内部类的test方法");
//    }
//}
//
//    public void test(){
//        System.out.println("外部类 的test方法");
//    }
//}
//public class Test2 {
//    public static void main(String[] args) {
//        OuterClass2.InnerClass innerClass = new OuterClass2().new InnerClass();
//        innerClass.test();
//    }
//}